package leetcode.LinkedList;

/**
 *  做出来的 但是耗内存
 * 给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 * 你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
 * @author MaoLin Wang
 * @date 2020/2/1017:21
 */
public class _24SwapPairs {
    public static ListNode swapPairs2(ListNode head) {
        if (head==null || head.next==null){
            return head;
        }
        ListNode result=new ListNode(0);
        ListNode p1;
        ListNode p2;
        result.next=head;
        ListNode pre=result;
        while (head!=null && head.next!=null){
            p1=head;
            p2=head.next;

            pre.next=p2;
            p1.next=p2.next;
            p2.next=p1;

            pre=p1;
            head=p1.next;

        }
        return result.next;

    }
    public static ListNode swapPairs(ListNode head) {
        if (head==null || head.next==null){
            return head;
        }
        ListNode p1=head;
        ListNode p2=head.next;
        ListNode p3=new ListNode(0);
        ListNode temp=p3;
        while (true){

            temp.next=new ListNode(p2.val);
            temp.next.next=new ListNode(p1.val);
            temp=temp.next.next;

            if (p2.next!=null && p2.next.next!=null){
                p1=p1.next.next;
                p2=p2.next.next;
            }else {
                while (p2.next!=null){
                    temp.next=p2.next;
                    temp=temp.next;
                    p2=p2.next;
                }
                break;
            }

        }
        return p3.next;

    }

    public static void main(String[] args) {
        ListNode l1=new ListNode(1);
        l1.next=new ListNode(2);
        l1.next.next=new ListNode(3);
        l1.next.next.next=new ListNode(4);


        ListNode node = swapPairs2(l1);
        ListNode.printNode(node);
    }
}
